﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using SistemaDeBastanteodePoderes.Negocio;
using SistemaDeBastanteodePoderes.Dominio;
using SistemaDeBastanteodePoderes.Persistencia;
using Spring.Context.Support;

namespace SistemaDeBastanteodePoderes.Pruebas.Negocio
{
    [TestFixture]
    public class Test_H5_CajeroService
    {
        IApplicationContext Spring = null;
        ICajeroService Service = null;

        Cliente clienteCreado = null;
        TipoEmpresa tipoEmpCreado = null;

        Representante representanteCreado = null;
        TipoDocumento tipoDocCreado = null;

        Bastanteo bastanteoCreado = null;
        TipoIntervencion tipoIntCreado = null;

        Poder poderCreado = null;
        TipoServicio tipoSerCreado = null;

        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaPersistencia.xml",
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaNegocio.xml"
                );

            Service = (ICajeroService)Spring.GetObject("cajeroService");
            tipoEmpCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Crear(new TipoEmpresa() { Abreviacion = "SAA", Descripcion = "SOCIEDAD ANONIMA ABIERTA" });
            clienteCreado = ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Crear(new Cliente()
            {
                nroRUC = "RUC01",
                razSocial = "RAZON01",
                fecIniOperaciones = DateTime.Now,
                tipEmpresa = tipoEmpCreado,
                cntEmpleados = 17
            });
            tipoDocCreado = ((ITipoDocumentoDAO)Spring.GetObject("tipoDocDAO_NH")).Crear(new TipoDocumento() { TipCorto = "DNI", TipLargo = "DOCUMENTO NACIONAL" });
            representanteCreado = ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Crear(new Representante()
            {
                TipDoc = tipoDocCreado,
                NroDoc = "00000001",
                Nombres = "NOMBRE 01",
                Apellidos = "APELLIDO 01",
                Cargo = "CARGO 01",
                GruBastanteo = "A",
                Empresa = clienteCreado
            });

            tipoSerCreado = ((ITipoServicioDAO)Spring.GetObject("tipoSerDAO_NH")).Crear(new TipoServicio() { Servicio = "ACTIVO" });
            poderCreado = ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Crear(new Poder()
            {
                CodCorto = "POD01",
                NomPoder = "PODER 01",
                Servicio = tipoSerCreado
            });

            tipoIntCreado = ((ITipoIntervencionDAO)Spring.GetObject("tipoIntDAO_NH")).Crear(new TipoIntervencion()
            {
                Intervencion = "A SOLA FIRMA"
            });
            bastanteoCreado = ((IBastanteoDAO)Spring.GetObject("bastanteoDAO_NH")).Crear(new Bastanteo()
            {
                Grupo = "A",
                PoderAsignado = poderCreado,
                Intervencion = tipoIntCreado,
                GruCombinacion = " ",
                ImpLimite = 10000,
                FecVencimiento = DateTime.Now.AddMonths(6),
                Empresa = clienteCreado
            });

        }

        [Test]
        public void Test1_Mensaje_PoderOK()
        {
            InformacionCajero infCaj = null;

            infCaj = Service.VerificarPoder("RUC01", tipoDocCreado.Codigo, "00000001", poderCreado.Codigo, 5000);

            Assert.IsNotNull(infCaj);
            Assert.IsTrue(infCaj.tienePoder);
            Assert.AreEqual(infCaj.mensaje, "Representante tiene Poder. Observe las condiciones de Intervencion, Grupo Combinacion, Importe Limite y Fecha de Vencimiento");

        }

        [Test]
        public void Test2_Mensaje_PoderNOK_Importe_Superior()
        {
            InformacionCajero infCaj = null;

            infCaj = Service.VerificarPoder("RUC01", tipoDocCreado.Codigo, "00000001", poderCreado.Codigo, 15000);

            Assert.IsNotNull(infCaj);
            Assert.IsFalse(infCaj.tienePoder);
            Assert.AreEqual(infCaj.mensaje, "Importe excede el limite permitido por el Poder");

        }



        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteCreado);
            ((IBastanteoDAO)Spring.GetObject("bastanteoDAO_NH")).Eliminar(bastanteoCreado);
            ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteCreado);
            ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poderCreado);
            ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Eliminar(tipoEmpCreado);
            ((ITipoDocumentoDAO)Spring.GetObject("tipoDocDAO_NH")).Eliminar(tipoDocCreado);
            ((ITipoIntervencionDAO)Spring.GetObject("tipoIntDAO_NH")).Eliminar(tipoIntCreado);
            ((ITipoServicioDAO)Spring.GetObject("tipoSerDAO_NH")).Eliminar(tipoSerCreado);
            Spring.Dispose();
            Spring = null;
        }

    }
}